// js
// function id(value) {
//   return value
// }

// 改成TS版本
function id(value: any) : any{
  return value
}


let r1 = id(1)
let r2 = id('abc')
// 需求是：
//   1. 参数的类型不确定的
//   2. 参数的类型和返回值类型一致

{
  // 定义 一个开泛型变量的函数  =====> 泛型函数
  // <> 泛型
  function id<T>(value:T) : T{
    return value
  }
  // 泛型的本质是 参数化类型
  const r1 = id<number>(1)

  const r2 = id<boolean>(false)

  // 没有明确传入T，但是TS可以自动猜出来
  let r3 = id('abc')
}

{
  // 泛型约束
  // 1. 让形参更加具体一点。例如，T[], 有length
  // 2. 添加约束，给它多一点限制条件
  // function id<T>(value:T) : T{
  //   return value
  // }
  // 1. 让形参更加具体一点。例如，T[], 有length
  function id<T>(value: T[]) : T[]{
    value.
    return value
  }

  const r1 = id<string>(['a'])
  const r2 = id<number>([1,2,3])
}

{
  // 泛型约束
  // 1. 让形参更加具体一点。例如，T[], 有length
  // 2. 添加约束，给它多一点限制条件: 从指定的接口继承
  // function id<T>(value:T) : T{
  //   return value
  // }
  interface IMyLength  { length: number, age: number }

  function id<T extends IMyLength>(value: T) : T{
    value.
    return value
  }
}
export {}
